4


Окна сообщения (MsgBox) и ввода (InputBox ). Объекты Debug (отладка) и Immediate (значения переменных)

Поговорим о функциях, которые помогают программистам. На лекции мы уже знакомились с функцией MsgBox(), которая выводит на экран диалоговое окно. Полный формат функции:

MsgBox(prompt [, buttons] [, title] [, helpfile, context])

1. Prompt - обязательный строковый параметр, который представляет собой сообщение. Допускается сообщение в несколько строк, для чего используются символы возврата каретки (chr(13)) и перевод строки (chr(10)).
2. Buttons - необязательный числовой параметр, равный сумме значений, указывающих на число и тип кнопок, тип значка и модальность окна сообщения. См. подробнее об этом параметре в файле справки.
3. Title - необязательный строковый параметр, который отображается с строке заголовка.
4. Helpfile - необязательный строковый параметр, определяющий имя файла справки, связанного с приложением.
5. Context - необязательный параметр, указывающий на номер раздела из файла справки.

Замечание. Если у окна сообщения указаны оба параметра Helpfile и Context, то пользователь может вызвать справку простым нажатием клавиши F1. Стоит сказать, что создание файла справки является хотя и простой задачей, но изучение этого вопроса выходит за рамки нашего курса.

Замечание. Если использование пиктограмм в функции MsgBox() интуитивно понятен, то вопрос о значениях, возвращаемых ей, довольно туманен. Поймите одно: при кликаньи на любой кнопке в окне сообщения MsgBox() в программу возвращается уникальное число, ради которого и было вызвано это окно. Именно поэтому длинная конструкция MsgBox(prompt, [buttons], ...) в программе присваивается некой переменной - после того, как пользователь кликнул на какой-то кнопке в программе должен произойти анализ значения, возвращенного функцией MsgBox().

Константа Значение Нажатая кнопка
vbOk 1 Ok
vbCancel 2 Отмена
vbAbort 3 Прервать
vbRetry 4 Повторить
vbIgnore 5 Пропустить
vbYes 6 Да
vbNo 7 Нет

Остается только сказать, что для удобства каждое значение, возвращаемое функцией MsgBox(), связано с именованной константой, и в программе при анализе можно использовать и то и другое. Рассмотрим полный формат функции InputBox(), которая позволяет выводить на экран диалоговое окно, содержащее поле ввода:

InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context])

1. Prompt - обязательный строковый параметр, который отображается как сообщение. Допускается сообщение в несколько строк.
2. Title - необязательный строковый параметр, отображаемый в строке заголовка диалогового окна.
3. Default - необязательный строковый параметр, отображаемый в поле ввода по умолчанию.
4. Xpos - необязательный числовой параметр, задающий расстояние по горизонтали между левой границей диалогового окна и левым краем экрана.
5. Ypos - необязательный числовой параметр, задающий расстояние по вертикали между верхней границей диалогового окна и верхним краем экрана.
6. Helpfile, Context - необязательные параметры, выполняющие те же функции, что и аналогичные параметры для функции MsgBox().

Нам совершенно неинтересно, что: в среде VB есть средства, облегчающие разработку приложений. Одним из них является объект Debug, предназначенный для вывода информации в собственное окно во время разработки (или тестирования) приложения. Вы, наверное, уже встречались с ситуацией, когда надо было узнать значение той или иной переменной на определенном этапе работы программы. Простейший способ - это выводить такие значения на форму командой Print, однако VB предлагает для этого специальный объект - Debug (отладчик) с двумя методами: Print (печатать), Assert (приостановление работы). Для наших целей вполне хватит знаний о том, что в любом месте программы мы можете вывести в окно Debug значение любой переменной по правилу:

Debug.Print "X=", X

Нам совершенно неинтересно, что: для того, чтобы увидеть значения переменных, выведенных в окно Debug, необходимо вызвать окно Immediate Window (горячая клавиша Ctrl+G). Это окно - достаточно мощное средство для вашей работы с вашей программой: вы можете увидеть в нем значение любой переменной.

? value
print value

Кроме того, окно обладает огромным количеством возможностей: 1) копировать (удалять, вставлять) данные из него в буфер; 2) продолжать выполнение программы (!); 3) продолжить выполнение программы в пошаговом режиме; 4) смотреть на выполнение кода в процедурах и функциях, если это подразумевается логикой программы; 5) перезапустить ваше приложение заново и пр. При аварийной остановке программы программист может выяснять значения интересующих его переменных. На рисунке, приведенном выше, видно состояние окна Immediate после того, как в него программно было выведено значение переменной i (равное 44231) и значение суммы 1+2 командами:

Debug.Print "i=", i
Debug.Print 1+2

После этого программа была остановлена сочетанием клавиш Ctrl+Break либо через меню Run | Break (либо вообще завершена) и программист начал выяснять значения интересующих его переменных.

Большой пример. Рассмотрим программу, которая занимается регистрацией пользователя: он вводит данные о себе, а программа проверяет их на корректность и заставляет пользователя вводить данные правильно. Ограничимся только некоторыми данными:

На форме присутствуют шесть меток, в которых находится информация для пользователя о том, какие данные необходимо вводить: фамилия, имя, отчество, год рождения, электронный адрес и метка-заголовок. Совершенно неважно, какие имена будут иметь метки и соответствующие им текстовые окна, поэтому нам подойдут стандартные имена Label1, ..., Label 6, TextBox1, ..., TextBox5. Двум командным кнопкам на форме можно дать значимые имена: cmdReg ("Регистрация"), cmdExit ("Выход").

Разберем алгоритм программы: итак, в идеале пользователь должен ввести в текстовые окна данные, щелкнуть на кнопке "Регистрация" и получить сообщение "Регистрация прошла успешно". Однако, логично предположить, что пользователь может допускать ошибки при вводе информации, в частности:

Разберемся со структурой программы. С фамилией, именем и отчеством пользователя все достаточно просто: необходимо проверить факт, что пользователь ввел в текстовые окна хотя бы что-нибудь; если нет, то надо вывести сообщение "Надо ввести фамилию (имя, отчество)". Для этого мы будем использовать функцию MsgBox().

Чтобы проанализировать правильный ввод года рождения пользователя необходимо сделать несколько операций: 1) ограничить число вводимых символов в четвертое текстовое окно четырьмя символами; 2) выяснить текущий год; 3) проверить находится ли число, введенное пользователем, между числом 1900 и текущим годом. Чтобы ограничить вводимые символы надо изменить свойство MaxLength элемента Label4 с "0" на "4". Чтобы выяснить текущий год необходимо воспользоваться встроенной функцией Year() и Date(): так как нам текущий год необходим в виде целого числа (кроме того, нам совершенно неинтересен текущий день и месяц), то для целой переменной intTG:

Private Sub Form_Activate()
intTG = Year(Date)
End Sub

Замечание. Так как переменная intTG должна получить значение еще до того, как с ней будет работать процедура cmdReg_Click(), то имеет смысл поместить инициализацию intTG в "самую первую" процедуру Form_Activate(), которая срабатывает при загрузке формы. Кроме того, в случае, если пользователь неправильно введет год своего рождения, заставим его сделать это с помощью функции InputBox() принудительно.

Чтобы проанализировать правильный ввод электронного адреса пользователя, необходимо просмотреть строку в пятом текстовом окне и если в строке присутствует символ "@" (и он не первый, и не последний), то все в порядке; иначе - надо выдать сообщение об ошибке.

Rem Описание переменных и директив проекта
Option Explicit
Dim intTG As Integer

Rem Кнопка "Выход"
Private Sub cmdExit_Click()
End
End Sub

Rem Кнопка "Регистрация"
Private Sub cmdReg_Click()
Dim i As Integer
Dim n As Integer
Dim flag As Boolean
Dim dog As Boolean

flag = True
dog = False

Rem Проверка фамилии, имени, отчества
If Text1 <> "" Then
     If Text2 <> "" Then
          If Text3 = "" Then
               i = MsgBox("Необходимо ввести отчество", , "ОШИБКА")
               flag = False
               Text3.SetFocus
          End If
     Else
            i = MsgBox("Необходимо ввести имя", , "ОШИБКА")
            flag = False
            Text2.SetFocus
          End If
Else
  i = MsgBox("Необходимо ввести фамилию", , "ОШИБКА")
  flag = False
  Text1.SetFocus
End If

Rem Проверка года рождения
i = Val(Text4)
While i < 1900 Or i > Year(Date)
i = Val(InputBox("Введите год вашего рождения", "ОШИБКА", i))
Text4 = i
Wend

Rem Проверка электронного адреса
n = Len(Text5)
For i = 1 To n
If Mid(Text5, i, 1) = "@" Then
                            dog = True
                            i = n
End If
Next i

If dog <> True Then
   i=MsgBox("В электронном адресе должен присутствовать символ @",, "ОШИБКА")
   flag = False
   Text5.SetFocus
End If

If flag Then i=MsgBox("РЕГИСТРАЦИЯ ПРОШЛА УСПЕШНО",vbOKOnly,"Поздравляем")
End Sub

Rem Процедура активации формы (загрузка)
Private Sub Form_Activate()
intTG = Year(Date)
End Sub

Некоторые комментарии. Поясним некоторые аспекты программы. Алгоритм проверки корректности данных находится в процедуре cmdReg_Click(). Внутри процедуры находится три условия (на ФИО, год, адрес), каждое из которых в случае невыполнения присваивает логической переменной flag значение false (ложь) и переводит фокус программы на текстовое окно с неправильными данными. Если переменная flag "дожила" до конца процедуры, сохранив свое первоначальное значение - true (истина), то регистрация считается успешной. Внутри процедуры использованы специфические функции и методы:

1) SetFocus - метод, который передает фокус на элемент управления;
2) Val() - функция, переводит строку в число;
3) Year(), Date() - функции, возвращающие соответственно текущие год и дату;
4) Mid() - функция, возвращающая часть строки.

При желании вы можете выяснить полный формат каждой функции (как и многих других) по справке VB.

Задания по лабораторной работе 4


1. Прочитать и законспектировать работу, проверить пример.
2. Разобрать два дополнительных примера (только для тех, у кого есть пособие и дискета с дополнительными примерами).
3. Выбрать любое отчетное задание: "создать программу, в которой..."
1 пользователь вводит фамилию, имя и отчество, а программа корректирует их, делая ФИО с больших букв или оставляя без изменений;
2 пользователь вводит два числа (радиус, число "пи"), а программа рассчитывает площадь круга;
3 пользователь вводит строку в одно текстовое поле, а во второе программа выводит эту строку "задом наоборот", причем, если введенная строка является палиндромом (т.е. читается одинаково в обе стороны), то программа сообщает об этом пользователю;
4 пользователь вводит цену товара, его количество и процент пошлины, а получает чистую прибыль, причем программа не работает в том случае, если количество товара меньше 100 единиц и выдает предупреждение, если пошлина больше 50 процентов;
5 происходит регистрация пользователя по шагам: ФИО, пароль (с подтверждением), название компании, название программы - в результате чего пользователь получает сгенерированный код доступа.

Хостинг от uCoz